package com.java.generic;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * 泛型数组
 */
public class LearnGenericArray {
    // 讨巧使用
    public static <T> T[] paramsArray(T... arg) { // 可变参数
        return arg; // 返回泛型数组
    }
    
    // 合理使用
    static class ReflectionArray<T> {
        public T[] array;
        
        public ReflectionArray(Class<T> type, int size) {
            array = (T[]) Array.newInstance(type, size);
        }
        
        public T[] create() {
            return array;
        }
        
        public void put(int index, T item) {
            array[index] = item;
        }
        
        public T get(int index) {
            return array[index];
        }
    }
    
    public static void main(String[] args) {
        // List<String>[] list1 = new ArrayList<String>[10]; // 编译错误，非法创建
        // List<String>[] list2 = new ArrayList<?>[10]; // 编译错误，需要强转类型
        List<String>[] list3 = (List<String>[]) new ArrayList<?>[10]; // 编译通过，但警告未检查的转换
        // List<?>[] list4 = new ArrayList<String>[10]; // 编译错误，非法创建
        List<?>[] list5 = new ArrayList<?>[10]; // 编译通过
        List<String>[] list6 = new ArrayList[10]; // 编译通过，但警告未检查的赋值
        
        Integer[] integers = paramsArray(1, 2, 3, 4, 5);
        String[] strings = new ReflectionArray<String>(String.class, 7).create();
    }
}
